مشخصات مقاله
-
4628
-
0.0
-
12570
-
0
-
1
پایگاه داده ی SQlite و content provider (قسمت اول)
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
استفاده از پایگاه داده ی SQlite
این فصل نحوه ی استفاده از پایگاه داده ی SQLite را در برنامه های کاربردی اندروید آموزش داده و همچنین نحوه ی استفاده از ContentProvider جاری و تعریف ContentProvider های جدید را تشریح می کند . سپس به مبحث کاربرد loader framework می پردازد که امکان بارگذاری داده ها را به صورت ناهمگام (asynch) فراهم می کند .
فهرست محتوا
1. SQLite
· SQLite چیست ؟
· کاربرد SQLite در اندروید
2. معماری SQLite
· پکیج ها
· ایجاد و بروز رسانی پایگاه داده به وسیله ی کلاس SQLiteOpenHelper
· پایگاه داده ی SQLite
· مثالی از فراخوانی متد rawQuery()
· مثالی از فراخوانی متد query()
· شئ Cursor
· ,ListViews ListActivities و SimpleCursorAdapter
3. آموزش استفاده از SQLite
· آموزش نحوه ی کار با پایگاه داده ی SQLite
· ایجاد پروژه
· پایگاه داده و مدل داده ای
· رابط کاربری
· راه اندازی برنامه های کاربردی
4. Content Provider و به اشتراک گذاری داده ها
· Content provider چیست ؟
· نحوه ی دسترسی به Content Provider
· ایجاد Content Provider اختصاصی
· Content Provider و بحث امنیت
· thread safety (ایمنی نخ)
5. آموزش استفاده از Content Provider
· بررسی اجمالی
· ایجاد بخش مخاطبین در محیط شبیه ساز
· استفاده از Content Provider مخاطبین
6. کلاس Loader
· هدف و کاربرد کلاس Loader
· پیاده سازی کلاس Loader
· پایگاه داده ی SQLite و کلاس CursorLoader
Cursor .7 و Loader
.8آموزش: SQLite, Content Provider اختصاصی و کلاس Loader
· توضیح مختصر
· پروژه
· کلاس های ویژه ی مدیریت پایگاه داده
· ایجاد Content Provider
· منابع
· طرح بندی ها
· Activity ها
· راه اندازی برنامه
9. دسترسی مستقیم به پایگاه داده ی SQLite
· محل ذخیره سازی پایگاه داده ی SQLite
· پوسته ی دسترسی (shell access) به پایگاه داده ی SQLite
10. افزایش و بهینه سازی کارایی
1. SQLite
SQLite چیست ؟
SQLite در حقیقت یک پایگاه داده ی منبع آزاد (open source) است. SQLite از ویژه گی های پایگاه داده ی رابطه ای (relational database) متعارف و استاندارد از جمله ترکیب نحوی (syntax) SQL, تراکنش ها (transaction) و prepared statement پشتیبانی می کند. گفتنی است که پایگاه داده ی نام برده در زمان اجرا به مقدار حافظه ی بسیار محدود و ناچیزی نیاز دارد (حدوداً 250 کیلوبایت) از همین رو گزینه ی فوق العاده مناسبی برای گنجاندن در دیگر runtime ها تلقی می گردد .
SQLite از نوع دادهای TEXT (مشابه String در جاوا), INTEGER (مشابه long در جاوا) و REAL (مشابه double در جاوا) پشتیبانی می کند. هر نوع داده ی دیگری باید پیش از ذخیره سازی در پایگاه داده به یکی از فیلدهای فوق تبدیل شود . خود پایگاه داده ی SQLite بررسی (اعتبار سنجی) نمی کند آیا نوع داده های نوشته شده در ستون ها از نوع های تعریف شده (real, intger, text) در این پایگاه داده هستند یا خیر, برای مثال برنامه نویس می تواند یک عدد صحیح (integer) داخل ستون رشته (column string) بنویسد و یا عکس آن را انجام دهد .
جهت کسب اطلاعات بیشتر می توان به وب سایت SQLite به نشانی http://www.sqlite.org مراجعه کرد.
کاربرد SQLite در اندروید
پایگاه داده ی مزبور بلا استثنا در تمامی دستگاه های اندروید گنجانده شده, بهمین دلیل استفاده از آن نیازی به فرایند نصب و مدیریت پایگاه داده ندارد .
کافی است دستورات SQL را ویژه ی ایجاد و بروز رسانی پایگاه داده تعریف کنید, سپس محیط یا پلتفرم اندروید خود به صورت خودکار پایگاه داده را برای شما مدیریت می کند .
دسترسی به سیستم فایل لازمه ی دسترسی به پایگاه داده ی SQLite می باشد, گرچه این فرایند ممکن است کمی کند صورت گیرد . بهمین دلیل توصیه می شود عملیات مربوط به پایگاه داده را به صورت ناهمگام (asynch) انجام دهید .
پایگاه داده ای که توسط اپلیکیشن ایجاد می شود به صورت پیش فرض در دایرکتوری DATA/data/APP_NAME/databases/FILENAME ذخیره می گردد .
بخش های مختلف دایرکتوری فوق بر اساس این قوانین ساخته می شوند : DATA مسیری است که متد Environment.getDataDirectory() بازمی گرداند, APP_NAME اسم اپلیکیشن است و FILENAME نیز اسمی است که برای پایگاه داده در کد برنامه ی کاربردی خود مشخص می کنید .
2. معماری SQLite
پکیج ها
بسته ی android.database دربردارنده ی تمامی کلاس های مورد نیاز جهت کار با پایگاه های داده می باشد, این در حالی است که پکیج android.package.sqlite حامل کلیه ی کلاس های ویژه ی پایگاه داده ی SQLite است .
ایجاد و بروز رسانی پایگاه داده به وسیله ی کلاس SQLiteOpenHelper
به منظور ایجاد و ارتقإ یک پایگاه داده در برنامه ی اندروید, لازم است یک زیرکلاس از کلاس SQLiteOpenHelper ایجاد کنید . ابتدا در سازنده (constructor) ی زیرکلاس, متد super () (مشتق کلاس SQLiteOpenHelper) را فرامی خوانید و بدین ترتیب اسم پایگاه داده و نسخه ی جاری پایگاه داده ی ذکر شده را مشخص می کنید .
حال در این کلاس باید متدهای زیر را جهت ایجاد و بروز رسانی پایگاه داده بازنویسی (override) کنید .
· onCreate () – در صورتی توسط framework صدا زده می شود که به پایگاه داده ی مورد نظر دسترسی پیدا شده اما پایگاه داده ی مذکور خود هنوز ایجاد نشده است .
· onUpgrade () – زمانی فراخوانده می شود که نسخه ی پایگاه داده در کد اپلیکیشن ارتقإ یافته باشد . به کمک این متد می توان شمای جاری پایگاه داده (database schema) را بروز رسانی کرد یا پایگاه داده را کلاً حذف (drop) کرد و آن را مجدداً با متد onCreate ساخت .
هر دو متد یک شئ SQLiteDatabase به عنوان پارامتر دریافت می کنند که قالب نمایشی جاوا از پایگاه داده می باشد .
کلاس SQLiteOpenHelper جهت دسترسی به شئ SQLiteDatabase در حالت خواندن (read mode) متد getReadableDatabase () و در write mode متد getWriteableDatabase () را ارائه می هد .
جدول های پایگاه داده (database table) باید از شناسه ی _id برای کلید اولیه (primary key) استفاده کند . بدیهی است که بسیاری از توابع اندروید بر این استاندارد تکیه دارند .
نکته : توصیه می شود برای هر جدول (table) یک کلاس مجزا ایجاد شود . این کلاس متدهای ایستا onCreate () و onUpgrade () را تعریف می کند . متدهای مزبور در متدهای مطابق و مربوطه مشتق کلاس SQLiteOpenHelper فراخوانده می شوند . بدین ترتیب پیاده سازی کلاس SQLiteOpenHelper حتی زمانی که شما چندین جدول باهم دارید, خوانا باقی می ماند .
پایگاه داده ی SQLite
SQLiteDatabase در واقع کلاس پایه برای کار با پایگاه داده ی SQLite در اندورید بوده و متدهایی به منظور بازکردن, بستن, بروز رسانی و پرس و جو از پایگاه داده فراهم می کند .
متدهایی که SQLiteDatabase ارائه می دهد عبارتند از insert () , update () و delete () .
البته علاوه بر توابع نام برده, متد execSQL () را نیز عرضه می کند که امکان اجرای دستور SQL را به صورت مستقیم فراهم می آورد .
شئ ContentValues امکان تعریف کلیدها/مقادیر را فراهم می کند . Key (کلید) در حقیقت نشانگر شناسه ی ستون در جدول بوده و Values (مقادیر) محتوای رکورد را در این ستون نمایش می دهد. از شئ ContentValues همچنین می توان برای درج (insert) و بروز رسانی داده استفاده کرد .
پرس و جوها (Queries) را می توان با فراخوانی متدهای rawquery () و query () و یا از طریق کلاس SQLiteQueryBuilder ایجاد کرد .
متد rawquery () مستقیماً دستور select (SQL) را به عنوان ورودی (input) می پذیرد .
متد query () یک رابط ساخت یافته ویژه ی مشخص کردن یا تعیین پرس و جوی SQL فراهم می کند .
SQLiteQueryBuilder یک convenience class (کلاسی که به منظور ایجاد سهولت در انجام تسک های دشوارتر و پیچیده طراحی شده و بکار می رود) می باشد که در ایجاد پرس و جوهای SQL به برنامه نویس کمک می کند.
مثالی از فراخوانی متد rawQuery()
تکه کد زیر نمونه ای از فراخوانی متد rawQuery () را نمایش می دهد .
Cursor cursor = getReadableDatabase().
rawQuery("select * from todo where _id = ?", new String[] { id });
مثالی از فراخوانی متد query()
کد زیر مثالی از فراخوانی متد query () را ارائه می دهد .
return database.query(DATABASE_TABLE,
new String[] { KEY_ROWID, KEY_CATEGORY, KEY_SUMMARY, KEY_DESCRIPTION },
null, null, null, null, null);
جدول 1. پارامترهای متد query ()
|
پارامتر |
توضیح |
|
String dbName |
نام جدول که query بر اساس آن کامپایل می شود |
|
String[] columnNames |
لیستی است که مشخص می کند کدام ستون های جدول برگردانده شوند . ارسال null تمامی ستون ها را باز می گرداند . |
|
String whereClause |
Where-clause ;فیلتری است که گزینش و انتخاب داده را مدیریت می کند . ارسال null کلیه ی داده ها را انتخاب می کند . |
|
String[] selectionArgs |
می توانید ؟ را داخل "whereClause" بگنجانید . این placeholder ها توسط مقادیر آرایه ی selectionArgs جایگزین می شود . |
|
String[] groupBy |
فیلتری است که نحوه ی گروه بندی سطرها را تعریف می کند . ارسال null مانع از گروه بندی سطرها می شود . |
|
String[] having |
گروه ها را فیلتر می کند . ارسال null باعث می شود هیچ فیلتری صورت نگیرد . |
|
String[] orderBy |
ستون های جدول که جهت مرتب سازی داده ها بکار می رود . ارسال null یعنی هیچ مرتب سازی صورت نمی گیرد . |
چنانچه شرطی مورد نیاز نبود می توانید null ارسال کنید .
"whereClause" بدون واژه ی "where", مشخص می شود, به طور مثال یک دستور "where" ممکن است چیزی شبیه آنچه در زیر مشاهده می کنید باشد :
"_id=19 and summary=?"
در صورتی که مقادیر placeholder را به وسیله ی ? در where clause تعریف کنید, در واقع دارید آن مقادیر را به عنوان پارامتر selectionArgs به query (پرس و جو) ارسال می کنید .
شئ Cursor
Query یک شئ cursor بازمی گرداند. Cursor نشانگر نتیجه ی پرس و جو یا query است و اساساً به یکی از سطرهای نتیجه ی پرس و جو اشاره دارد. بدین وسیله اندروید می تواند نتایج پرس و جو را به صورتی کارامدتر و موثرتر بافر یا به صورت موقت ذخیره کند (به این خاطر که دیگر نیازی نیست همه ی داده را داخل حافظه بارگذاری کند) .
برای بدست آوردن تعداد المان های نتیجه ی پرس و جو از متد getCount () استفاده کنید .
به منظور راه گزینی و پیمایش از یک سطر داده (data row) به سطری دیگر می توان از متدهایmoveToFirst () و moveToNext () بهره گرفت . متد () isAfterLast به شما اجازه می دهد بررسی کنید آیا به انتهای نتیجه پرس و جو رسیده اید یا خیر .
Cursor متدهای get*() (نوع آن کاملاً مشخص شده / strongly typed) از جمله getLong(columnIndex) , getString(columnIndex) را جهت دسترسی به داده های ستون مربوط به موقعیت کنونی نتیجه ارائه می دهد . "columnIndex" نیز همان شماره ی ستونی است که به آن دسترسی پیدا می کنید .
Cursor همچنین متد getColumnIndexOrThrow (String) را برای دستیابی به شاخص ستون (column index) مربوط به اسم ستون جدول فراهم می کند.
شئ Cursor را می توان با فراخوانی متد close () بست .
,ListViews ListActivities و SimpleCursorAdapter
همان طور که می دانید ListView ها عبارتند از View هایی که امکان نمایش فهرستی از آیتم ها را فراهم می آورد .
ListActivities نیز در حقیقت activity های تخصصی هستند که استفاده از ListView ها را تسهیل می بخشند.
جهت کار با پایگاه های داده و ListView ها می توان از کلاس simpleCursorAdapter بهره گرفت . کلاس ذکر شده اجازه می دهد ویژه ی هر سطر از listViews یک layout انتخاب کنید .
همچنین لازم است یک آرایه که دربردارنده ی اسم های ستون و آرایه ی دیگر که حاوی شناسه های Views باشد تعریف کنید . شناسه های views نیز باید با داده ی مورد نیاز پر شود .
کلاس simpleCursorAdapter ستون ها را در views بر اساس Cursor ای که به آن ارسال شده نگاشت می کند .
به منظور دستیابی به Cursor از کلاس Loader کمک بگیرید .
3. آموزش استفاده از SQLite
آموزش نحوه ی کار با پایگاه داده ی SQLite
در این بخش نحوه ی کار با پایگاه داده ی SQLite تشریح می شود . جهت مدیریت بهینه ی داده از شئ دسترسی به داده (DAO = data access object) کمک می گیریم . DAO وظیفه ی مدیریت اتصال به پایگاه داده, دسترسی و اصلاح داده را بر عهده دارد. مسئولیت دیگر آن نیز در تبدیل پایگاه داده به اشیإ واقعی جاوا خلاصه می شود به طوری که کد رابط کاربری ما دیگر مجبور به برخورد با persistence layer )لایه ی ماندگاری) نباشد .
در نتیجه ی برنامه ی کاربردی که تولید می شود به شکل ذیل خواهد بود :
لازم به ذکر است که همیشه استفاده از DAO رویکرد صحیحی نیست . توجه داشته باشید که استفاده از DAO منجر به تولید model object جاوا می شود, این در حالی است که در صورت استفاده ی مستقیم از خود پایگاه داده یا از طریق Content Provider , می توان از ایجاد model object اجتناب کرد و بهمین دلیل از منابع کمتری بهره گرفت .